PIC18 電圧計/温度計



  PIC18シリーズは、12Fや16Fシリーズとは コンパイラとプログラムの書式が若干異なるが、ADコンバーター、通信、INT入力等の機能が充実し、フラッシュメモリ、RAMの容量も大きく、8 ビットマイコンのハイエンド機種の位置付けにある。 とりわけ、PIC18F14K50、18F2550、18F4550などは別名”USBマイコン”ともいわれ、入手しやすい USB内蔵マイコンである。



  1. MPLAB C18 のダウンロード と セットアップ:


  ・ PIC18シリーズ用の Cコンパイラは、マイクロチップテクノロジー社のウェブページから 評価版(無償、60日で最適化の機能が無くなる)をダウンロードする。(ダウンロードのための登録記入が必要。 また、”学習版”は最適化の機能がなくなったものと同じ)
       http://www.microchip.com/  → Development Tools → Compilers → MPLAB C Compiler for PIC18 MCUs → ・・・ Standard-Eval Version(=評価版)

  ・ MPLAB C18MPLAB IDE から使うには、@ MPLAB IDEに実行ファイル(.exe)の位置を知らせ、A ヘッダとライブラリの検索パスを設定する必要がある。

     MPLAB IDEを起動し、 [Project] → [Set Language Tool Location] → [Microchip C18 Toolsuite]

      @ (実行ファイルの選択)  [Executables] の下層項目で、[Brows]で選択 (起動ドライブをCと仮定して、)
                            MPLAB C18 C Compiler:  C:\MCC18\bin\mcc18.exe
                            MPLIB Librarian:       C:\Program Files\Microchip\MPASM Suite\mplib.exe
                            MPLINK Object Linker:  C:\Program Files\Microchip\MPASM Suite\mplink.exe
      A (検索パスの設定)  [Default Search Path] で、
                            [Include Search Path]: (ヘッダ) C:\MCC18\h
                            [Library Search Path]: (フォルダ) C:\MCC18\lib   を選択

  * 実行ファイル、検索パスの関連付け(@、A)は、C18コンパイラのアセンブラ、ライブラリアン、リンカ (C:\Program Files\Microchip\mplabc18\bin\mcc18.exe、 C:\Program Files\Microchip\mplabc18\bin\mplib.exe、 C:\Program Files\Microchip\mplabc18\bin\mplink.exe、C:\Program Files\Microchip\mplabc18\h、 C:\Program Files\Microchip\mplabc18\lib)  のようにしても良い。

  ・ プロジェクト作製では、プロジェクトウィザードから開き、言語では Microchip C18 ToolSuite を選択する。(その他は PIC16と同様) ビルドは、Make ボタンで行なう。

  ・ hex. ファイルのPICへの書き込みは、 PIC kit 2 または  で問題なく行なえるが、これが無くても USBコネクタを接続しておけば、ブートローダをパソコンから書き込むことができる。


       (メモリ比較)

     PIC18F14K50 フラッシュ(プログラムメモリ): 16kバイト、   RAM: 768バイト、  EEPROM: 256バイト
     PIC18F2550                       32kバイト、         2048バイト、          256バイト
     PIC18F4550                       32kバイト、        2048バイト、          256バイト

  cf. PIC16F675                   1kワード(1ワード=14ビット)、  64バイト、           128バイト
      PIC16F628A                        2kワード、        224バイト、           128バイト
      PIC16F877A                        8kワード、        368バイト、           256バイト




  2. PIC18F14K50 LCD表示電圧計の作製:


  PIC18F14K50 (20pin)は価格(200円前後)の割りに機能が充実し、フラッシュメモリ、RAM容量も充分ある。 ここではまず、 ADコンバーターLCD表示を含む 簡易電圧計を作製した。

  アナログ入力 AN8、9 を使い、INT0、1入力、CCP1出力ピンを取っておくために、LCDの DB4〜7 に接続する端子には RB4〜7 を用いた。(シリアル通信(TX、RX) を用いる場合は、RC4〜7 を用いる。 因みに、RA0、1、3は入力専用で出力用にできない。) LCDは通常用いてきた SC1602B(16文字×2行キャラクター液晶)を使用。
  内部発振4MHz → 動作1MHz)に設定したので、ここではセラミック発振子や水晶は使わない。発振子を使用する場合の最高速度は 12MHz 発振で 内部 PLLにより48MHzとなり、USB2.0のフルスピード(12Mビット/秒)に対応する。

  USBコネクタは、Bタイプを用いるべきで、ここではミニBを用いたので、これには1.5mmtのプリント基板の厚み程度のピンの長さしかなく、加工が難しかった。(ピンすべてにφ.2程度のメッキ線を半田付けしてから穴に差込み伸ばす)
  電池電源からのセルフパワーが切れた際に、USBコネクタの1ピンからの パソコンのバスパワー(5V電源)に切り替えるための回路を付け加えた。これは、セルフパワーがつながっている場合は、バスパワーからの電流はFET(2SJ680、2.5A、ON抵抗1.6Ω)によって阻止され、セルフパワーのみによる供給が行なわれる。逆流防止用の ショットキーダイオード(1S4)は電圧降下が0.2V程度と低いのでこれを用いる。(他のシリコンダイオードでは0.6V)
  
 


  3. C18のプログラム:


  コンフィグレーションの書式は、PIC12や16シリーズとかなり異なっていて、項目が多く とっつきにくい。 ピンの機能を一括管理するレジスタのようなものは存在せず、それぞれの機能ごとに有効/無効を設定する。(概して、アナログがデジタルよりも優先、入力が出力よりも優先)

  時間を規定する delays 関数は、ライブラリのヘッダファイルをそのまま呼び出す。 内部クロック4MHz(動作クロック1MHz)なので、時間の最小単位は Delay1TCY( ) = 1μS となる。

  LCD表示のための関数は、PIC16シリーズと同じように ソースファイルに入れたが、決まりきっているので 同じプロジェクトフォルダに入れて、ヘッダーファイルとして呼び出すこともできる。 (LCD用のヘッダーファイル群は MPLAB、C18の ライブラリにもあるが、使い方が煩雑で 一般にもあまり用いられていない)
  ケースバイケースで小数点を入れて10進表示するための lcd_putv( ) のような関数は、ソースファイルに書いた方が 書き換えに便利である。

  (コンフィグレーションと 液晶表示関数部分)

  


  ADコンバータのプログラムは、あらかじめ プロジェクト・フォルダ(メモ帳ファイルとして保存)に入れておいて、そこからヘッダーファイル lib_adc.h として取り込み、メイン関数のループの中で初期化(基準電圧選択、チャンネル選択、データの右寄せなど)をする。
  PIC18F14K50では、ADコンバータの選択を ANSELANSELH で、1:1対応で簡単に行なえる。(PIC18F2550では ADCON1の設定が必要)
  ADコンバータの参照電圧Vdd と Vss(GND) の差 = 5VADC_REFの記述)としたので、この回路の場合はレギュレータの電源電圧の安定化が精度のポイントとなる。参照電圧に 電圧リファレンスIC(TL431など)を使ったほうがさらに良い。

  変換されたデータは10ビットで、ADRESH(上位8ビット) と ADRESL(下位8ビット) に分けられてレジスタに入るので、それを2バイト(16ビット)に宣言された int変数( v 等)に読み込む。
  * この際注意すべきことは、 v = (ADRESH << 8)|ADRESL のようにシフトレジスタで行なうと、データの取り込みが不安定になって表示がふらつくので、 v = (ADRESH * 256) + ADRESL のように演算式にする

  変換データは、5Vを1024分割した単位になっているので、49を掛けて5桁の数値とし、そのまま2番目に小数点を入れて表示する。 アッテネーター等を付けた場合は、倍率を変化させる。いずれにしても、216 − 1 = 65535 をオーバーフローしないように気をつける。オーバーフローする場合は、Bresenham アルゴリズムにより計算することができる。( → PIC応用回路(3)A ) (* さらに桁数が多い場合は初めから long 変数 を使用)

  (メイン関数部分: AD変換、LCD表示)
  


  チャンネルの片側がOPENになっていると、電気的な原因で表示がふらつくので、アースと短絡しておく。アッテネータ温度計測用ICなど、抵抗を介してアースに落とす場合は問題ない。
  デジタルテスターとの同時測定結果より、ADコンバータ単独の性能は、0.5V以下では上に凸の曲線となって歪むので、(通常行なわれているように、)オペアンプ(NJU7032D、LM358Nなど)の 増幅器+差動アンプ・バッファ を前段に付けて、5〜10倍(= 1〜4.5V程度)にしてからPICに入れたほうが良いと思われる。 1V〜4.5Vでは直線性はまあOK。

   

   ● ソース:      lib_adc.h



  4. 温度計と切り替えスイッチの追加:


  温度センサIC としては、出力電圧が摂氏温度に比例して使いやすい LM35DZ(温度(℃)×10 = ○○○mV、 0〜100℃)を用いた。このため、10進表示関数 putv() を直して putt() として、○○.○(℃) の表示とした。刻みは0.5℃くらい。
  また、タクトスイッチによって、先の電圧計表示と、この温度計表示を切り替えるために、INT0による割込み関数を作製した。

  PIC18F14K50 の外部割込み用の入力ピン( INTピン)は3本あり、また、タイマー0、1、2、3、 ADコンバータ変換終了、コンパレータ比較完了、キャプチャ/コンペア、シリアル送受信完了、I2C/SPI各種動作、USB各種動作など、一通りの割込み機能を持っている。中でも PIC12、16よりも改良された点は、割り込みの優先順(高優先、低優先のみ)がつけられることである。
  ここでは、スイッチ1個だけで、タイマー割込みなどを使わないので、優先順の無い 単純割込みで行なうことにする。(INT0は 常時 高優先となる)
  割込みベクタのアドレスを指定する際、 goto という分岐命令(ジャンプ命令)は、唯一、C言語では困難な文法であり、わざわざアセンブリー言語に直してから行なう。

   

   ● ソース:      lib_adc.h


                 戻る            トップへ戻る